package main

import "fmt"

/*
需求：做一个通用的加法函数，难点：入参的类型比较多，那么传参的类型也会比较多
interface{} 是一个空的interface类型， 空的interface没有方法，所以可以认为所有的类型都实现了interface{}。
如果定义一个函数参数是 interface{} 类型， 这个函数应该可以接受任何类型作为它的参数(似乎slice类型转interface{}会报错)。
*/

// interface{}可以和其他类型转化，入参其他类型转为interface{}，返回值的时候其他类型转为interface{}
func add(a, b interface{}) interface{} {
	//a.(tyep)获取a的类型
	fmt.Printf("a = %v, b = %v\n", a, b)
	switch a.(type) {
	case int:
		//a.(int)表示interface{}转为int类型
		ai, ok := a.(int)
		if !ok {
			fmt.Println("类型转发错误")
		}
		bi, _ := b.(int)
		return ai + bi
	case float32:
		ai, _ := a.(float32)
		bi, _ := b.(float32)
		return ai + bi
	case float64:
		ai, _ := a.(float64)
		bi, _ := b.(float64)
		return ai + bi
	case string:
		ai, _ := a.(string)
		bi, _ := b.(string)
		return ai + bi
	default:
		panic("not supported type")
	}
}

func main() {
	// 所以说当入参和返回值类型动态变化时可以用interface{}来代替转化
	a := 6.3
	b := 8.2
	fmt.Println(add(a, b))
}
